// var path = basePath;
// var jspCode = $("#userId").val();
// var websocket;
// createWebSocket();

// /**
//  * websocket启动
//  */
// function createWebSocket() {
//     try {
//         if ('WebSocket' in window) {
//             websocket = new WebSocket((path + "/wsCrm?jspCode=" + jspCode).replace("http", "ws").replace("https", "ws"));
//         } else if ('MozWebSocket' in window) {
//             websocket = new MozWebSocket(("ws://" + path + "/wsCrm?jspCode=" + jspCode).replace("http", "ws").replace("https", "ws"));
//         } else {
//             websocket = new SockJS(path + "/wsCrm/sockJs?jspCode=" + jspCode.replace("http", "ws"));
//         }
//         init();
//     } catch (e) {
//         console.log('catch' + e);
//         reconnect();
//     }

// }

// function init() {
//     //连接成功建立的回调方法
//     websocket.onopen = function(event) {
//         console.log("WebSocket:已连接");
//         //心跳检测重置
//         heartCheck.reset().start();
//     };

//     //接收到消息的回调方法
//     websocket.onmessage = function(event) {
//         showNotify(event.data);
//         console.log("WebSocket:收到一条消息", event.data);
//         heartCheck.reset().start();
//     };

//     //连接发生错误的回调方法
//     websocket.onerror = function(event) {
//         console.log("WebSocket:发生错误");
//         reconnect();
//     };

//     //连接关闭的回调方法
//     websocket.onclose = function(event) {
//         console.log("WebSocket:已关闭");
//         heartCheck.reset(); //心跳检测
//         reconnect();
//     };

//     //监听窗口关闭事件，当窗口关闭时，主动去关闭websocket连接，防止连接还没断开就关闭窗口，server端会抛异常。
//     window.onbeforeunload = function() {
//         websocket.close();
//     };

//     //关闭连接
//     function closeWebSocket() {
//         websocket.close();
//     }

//     //发送消息
//     function send(message) {
//         websocket.send(message);
//     }
// }

// //避免重复连接
// var lockReconnect = false,
//     tt;

// /**
//  * websocket重连
//  */
// function reconnect() {
//     if (lockReconnect) {
//         return;
//     }
//     lockReconnect = true;
//     tt && clearTimeout(tt);
//     tt = setTimeout(function() {
//         console.log('重连中...');
//         lockReconnect = false;
//         createWebSocket();
//     }, 4000);
// }

// /**
//  * websocket心跳检测
//  */
// var heartCheck = {
//     timeout: 5000,
//     timeoutObj: null,
//     serverTimeoutObj: null,
//     reset: function() {
//         clearTimeout(this.timeoutObj);
//         clearTimeout(this.serverTimeoutObj);
//         return this;
//     },
//     start: function() {
//         var self = this;
//         this.timeoutObj && clearTimeout(this.timeoutObj);
//         this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
//         this.timeoutObj = setTimeout(function() {
//             //这里发送一个心跳，后端收到后，返回一个心跳消息，
//             //onmessage拿到返回的心跳就说明连接正常
//             websocket.send("HeartBeat");
//             console.log('ping');
//             self.serverTimeoutObj = setTimeout(function() { // 如果超过一定时间还没重置，说明后端主动断开了
//                 console.log('关闭服务');
//                 websocket.close(); //如果onclose会执行reconnect，我们执行 websocket.close()就行了.如果直接执行 reconnect 会触发onclose导致重连两次
//             }, self.timeout)
//         }, this.timeout)
//     }
// };

// let wsConnection = {
//     num: 1,
//     $ws: null,
//     lockReturn: false,
//     timeout: 1000 * 15,
//     timeoutObj: null,
//     timeoutNum: null,
//     serverTimeoutObj: null,
//     //wsurl :'ws://' +"47.115.5.236:8505"+ '/socketServer',
//     wsuri: null,
//     actions: null,
//     //初始化webSocket长连接
//     initWebSocket: function(url, data) {
//         if (url !== undefined) {
//             wsConnection.wsuri = url;
//         }
//         if (data !== undefined) {
//             wsConnection.actions = data;
//         }
//         // let userInfo = JSON.parse(sessionStorage.getItem('user'))
//         try {
//             wsConnection.$ws = new WebSocket(wsConnection.wsuri); //写入地址 这里的地址可以在initWebSocket方法加入参数
//             wsConnection.init();
//         } catch (e) {
//             console.log(' init catch error  ');
//             wsConnection.reconnect();
//         }
//     },
//     init: function() {
//         wsConnection.lockReturn = false;

//         wsConnection.$ws.onopen = wsConnection.wsOpen;
//         wsConnection.$ws.onclose = wsConnection.wsClose;
//         wsConnection.$ws.onmessage = wsConnection.wsMsg;
//         wsConnection.$ws.onerror = wsConnection.wsError;
//     },
//     //打开websocket
//     wsOpen: function(e) {
//         console.log(' websocket open  ')

//         // 建立连接后，修改标识
//         wsConnection.lockReturn = false;

//         try {
//             wsConnection.$ws.send(JSON.stringify(wsConnection.actions));
//             console.log(wsConnection.actions, ' wsOpen send  ');
//             wsConnection.startWsHeartbeat();
//         } catch (e) {
//             console.log(e, ' wsOpen catch error  ');
//             wsConnection.reconnect();
//         }
//     },
//     wsClose: function(e) {

//         if (e && e.code != 1000) {
//             wsConnection.lockReturn = false;

//             wsConnection.reconnect();

//             console.log(e.code, ' websocket close reconnect  ')
//         } else {
//             wsConnection.lockReturn = true;

//             wsConnection.$ws.close();

//             console.log(e.code, ' websocket closed  ')
//         }
//     },
//     wsMsg: function(e) {
//         console.log(e, ' websocket message  ')

//         //每次接收到服务端消息后 重置websocket心跳
//         wsConnection.resetHeartbeat();

//         //服务端发送来的消息存到vuex
//         store.commit('web_socket_msg', e);
//     },
//     wsError: function(err) {
//         // 建立连接后，修改标识
//         wsConnection.lockReturn = false;

//         console.log(err, ' websocket error  ')

//         wsConnection.reconnect()
//     },
//     //重启websocket
//     reconnect: function() {
//         if (wsConnection.lockReturn) {
//             return;
//         }
//         wsConnection.timeoutObj && clearTimeout(wsConnection.timeoutObj);
//         wsConnection.serverTimeoutObj && clearTimeout(wsConnection.serverTimeoutObj);
//         wsConnection.timeoutNum && clearTimeout(wsConnection.timeoutNum);
//         wsConnection.timeoutNum = setTimeout(function() {
//             wsConnection.initWebSocket();
//             console.log(' websocket reconnect  ')
//         }, 3000);
//     },
//     startWsHeartbeat: function() {
//         wsConnection.timeoutObj && clearTimeout(wsConnection.timeoutObj);
//         wsConnection.serverTimeoutObj && clearTimeout(wsConnection.serverTimeoutObj);

//         wsConnection.timeoutObj = setTimeout(function() {
//             //判断websocket当前状态
//             if (!wsConnection.lockReturn) {
//                 try {
//                     wsConnection.$ws.send("ping"); // 心跳包
//                     console.log(' heartbeat ing  ')
//                 } catch (e) {
//                     console.log(e, ' heartbeat catch error  ');
//                     wsConnection.reconnect();
//                 }
//             }

//             /* wsConnection.serverTimeoutObj = setTimeout(function() {
//                 if (!wsConnection.lockReturn) {
//                     wsConnection.reconnect();
//                     console.log(' heartbeat reconnect  ')
//                 }
//             }, wsConnection.timeout); */

//         }, wsConnection.timeout);
//     },
//     //重置websocket心跳
//     resetHeartbeat: function() {
//         // 建立连接后，修改标识
//         wsConnection.lockReturn = false;

//         wsConnection.timeoutObj && clearTimeout(wsConnection.timeoutObj);
//         wsConnection.serverTimeoutObj && clearTimeout(wsConnection.serverTimeoutObj);

//         console.log(' heartbeat reset  ')

//         wsConnection.startWsHeartbeat();
//     }
// };



// //抛出websocket对象
// export default wsConnection

import store from '../store/store';
if ("".trim === undefined) {
    String.prototype.trim = function () {
        return this.replace(/(^\s*)|(\s*$)/g, "");
    }
    String.prototype.ltrim = function () {
        return this.replace(/(^\s*)/g, "");
    }
    String.prototype.rtrim = function () {
        return this.replace(/(\s*$)/g, "");
    }
}

/**
 * 定义问诊中收发的数据包类型
 * @type {{logout: number, addPatientQueue: number, joinRoom: number, msgResponse: number, login: number, msgRequest: number, patientQueueList: number}}
 */
var dataType = {
    login: 1, // 登陆请求
    logout: 2, // 登出请求
    msgRequest: 3, // 发送信息
    msgResponse: 4, // 收到消息
    addPatientQueue: 5,  // 【患者】申请问诊排队
    patientQueueList: 6,  // 【患者】问诊中排队的患者列表
    joinRoomRequest: 7,         // 医生[接诊]：请求患者进入问诊房间
    // 更多事件码没有列举完……
};
// var wsUrl = "ws://" + location.hostname + ":8506/websocket";
var wsConnection = {
    heartbeatTime: 8000,  // 心跳时间
    wsUrl: "",
    token: "",
    ws: {},
    intervalId: 0,  // 心跳定时器id
    lock: false,
    initWebSocket: function (wsUrl, token) {
        if (wsUrl) {
            this.wsUrl = wsUrl;
        }
        if (token) {
            this.token = token;
        }
        var that = this;
        this.ws = new WebSocket(this.wsUrl);
        this.ws.onopen = this.onOpen.bind(this);
        this.ws.onmessage = function (event) {
            console.log(event,'msg')
            if (typeof event.data === 'object') {
                var reader = new FileReader();
                reader.onload = function (event) {
                    var content = reader.result.trim();
                    if (content.indexOf("{") === 0) {
                        content = JSON.parse(content);
                        that.onMessage(content);
                    }

                };
                store.commit('web_socket_msg', e);
                reader.readAsText(event.data);
            }
        };
        this.ws.onclose = this.onClose.bind(this);
        this.ws.onerror = this.onError.bind(this);
    },
    onOpen: function (event) {
      console.log('等； 啊啊啊   ')
        this.login();
        this.resetHeartbeat();
    },
    onMessage: function (msg) {
        console.log(msg);
    },
    onClose: function (evt) {
        console.log("Connection closed.");
        // && sessionStoreage.accessToken
        if (evt.code!==1000){
            this.reconnect();
        }
    },
    onError: function (ev) {
        this.reconnect();
    },
    login: function () {
        // 进行登录认证
        this.send(dataType.login, {token: this.token});
    },
    reconnect: function () {
        if (this.lock) {
            return;
        }
        this.lock = true;
        var that = this;
        this.intervalId = setTimeout(function () {
            that.initWebSocket();
            that.lock = false;
        }, 3000);
    },
    startWsHeartbeat: function () {
        var that = this;
        this.intervalId = setInterval(function () {
            //判断websocket当前状态
            // 0 ：对应常量 正在建立连接连接，还没有完成。
            // 1 ：对应常量OPEN   连接成功建立，可以进行通信。
            // 2 ：对应常量CLOSING  连接正在进行关闭握手，即将关闭。
            // 3 : 对应常量CLOSED  连接已经关闭或者根本没有建立。
            if (that.ws.readyState === 1) {
                that.ws.send("ping"); // 心跳包
            } else if (3 === that.ws.readyState) {
                that.reconnect();
            }
        }, this.heartbeatTime);
    },
    resetHeartbeat: function () {
        this.intervalId > 0 && clearInterval(this.intervalId);
        this.startWsHeartbeat()
    },
    /**
     *
     * @param type 信息包类型
     * @param data 发送的需要发送的数据
     */
    send: function (type, data) {
        if (!data) {
            data = {};
        }
        data.packageType = type;
        if (this.ws.readyState !== 1) {
            console.log('链接状态=' + this.ws.readyState + '不可发送消息 ' );
            return;
        }
        data = JSON.stringify(data);
        this.ws.send(new Blob([data], {type: "text/plain;charset=utf-8"}));
    }
};

// var wsUrl = "ws://" + location.hostname + ":8506/websocket";
// // =============================================== 以下为测试代码 ===============================================








var wsUrl = "ws://" + location.hostname + ":8506/websocket";
// 登录的token
// 这个是患者或医生的IM主键，医生->患者IM ，患者->医生IM
var friendId = 12;
// 从URL 中读取参数进行数据初始化
var param = getRequestQuery();
restParam();
// 可以重写方法
wsConnection.onMessage = function (msg) {
    // todo 判断数据包类型进行后续处理 dataType
    console.log(msg);
    var info = document.getElementById('log');
    info.innerHTML = info.innerHTML + JSON.stringify(msg) + '<br/>';
};
// 初始化链接
wsConnection.initWebSocket(wsUrl, param.token);



/**
 * 模拟发送聊天信息 输入框的文本
 */
function sendMsg() {
    var msg = document.getElementById('msg').value;
    wsConnection.send(dataType.msgRequest, {
        "msgText": msg,
        "friendId": friendId,
        "msgType": 0,
        "msgDate": formatDate(new Date())
    });
}

/**
 * 模拟加入排队中
 * @returns {Blob}
 */
function addPatientQueue() {

    wsConnection.send(dataType.addPatientQueue, {
        logId: 212, // 本次问诊的id
        doctorImId: 10 // 医生id
    }) ;
}


function restParam() {
    param = getRequestQuery();
    if (param.friendId) {
        friendId = param.friendId;
    }
    if (param.token) {
        token = param.token;
    }
}

/**
 *
 * @param date
 * @param format
 * @returns {string}
 */
function formatDate(date, format) {
    if (format === undefined) {
        format = 'YY-MM-DD hh:mm:ss';
    }

    var year = date.getFullYear(),
        month = date.getMonth() + 1,//月份是从0开始的
        day = date.getDate(),
        hour = date.getHours(),
        min = date.getMinutes(),
        sec = date.getSeconds();
    var preArr = Array.apply(null, Array(10)).map(function (elem, index) {
        return '0' + index;
    });
    var newTime = format.replace(/YY/g, year)
        .replace(/MM/g, preArr[month] || month)
        .replace(/DD/g, preArr[day] || day)
        .replace(/hh/g, preArr[hour] || hour)
        .replace(/mm/g, preArr[min] || min)
        .replace(/ss/g, preArr[sec] || sec);

    return newTime;
}

/**
 * 测试方法需要- 由URL中获取参数
 * @constructor
 */
function getRequestQuery() {
    var obj = {};
    var url = location.search; //获取url中"?"符后的字串
    if (url.indexOf("?") !== -1) {    //判断是否有参数
        var str = url.substr(1); //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串
        strs = str.split("&");
        if (strs.length > 1) {
            strs.forEach(function (v) {
                var a = v.split('=');
                obj[a[0]] = a[1];
            });
        }
    }
    return obj;
}

